<?php
/*
 * $Id: ModifyPresence.class.php 253 2009-11-30 02:40:16Z takuji.mezawa $
 * 
 * (C) 2009, Mezawa Takuji, EzoGP (http://ezogp.sourceforge.jp/).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// オブジェクト参照定義
require_once "model/logic/BaseBizlogic.class.php";
require_once "app/models/dao/GroupUsersDao.class.php";
require_once "app/models/dao/EventUsersDao.class.php";

/**
 * イベント参加情報の出欠情報を更新するビジネスロジッククラス。
 * 
 * イベント情報照会(mb200 or mb240)から選択されたイベント情報に関する参加出欠情報だけを変更する。
 * 出欠情報はイベント情報の変更や削除に含まれるものだが、処理要求として出欠情報変更だけ、もしくはイベント情報
 * 変更に出欠情報が含まれるいずれかの場合に、呼び出されて処理を実行することになる。
 * 
 * @author     $Author: takuji.mezawa $  (EzoGP)
 * @version    $Revision: 253 $
 * @package    models
 * @subpackage logic
 */
class ModifyPresence extends BaseBizlogic {
    private static $log;                    // ロガー
    private static $typename = __CLASS__;   // 自身のクラス名
    
    /**
     * コンストラクタ。
     * 
     * 1. ロガーの生成を行う。
     */
    public function __construct() {
        self::$log =& LoggingObject::getLogger(PTA_LOG_CATEGORY);
    }
    
    /**
     * デストラクタ。
     */
    public function __destruct() {
        self::$log->info(sprintf("%s destructed.", self::$typename));
    }
    
    /**
     * (non-PHPdoc)
     * @see syracava/libs/model/logic/BaseBizlogic#execute($param)
     */
    public function execute(array $param) {
        self::$log->start(__METHOD__);
        
        // データベースに接続する
        $_conn = self::getConnection();
        
        $_res = array();
        try {
            // 必要な情報をバックエンドから取得
            $_handled = self::handleBackendData($param['groupId'], $param['userId'], $_conn);
            
            $_euDao =& new EventUsersDao($_conn);           // イベント参加情報DAOの生成
            $_euDao->startTransaction($_conn);              // トランザクション制御の開始
            $_euDao->update("presence_modify", array(
                'presence'    => $param['presence'],
                'groupuserId' => $_handled['gus']->getId(),
                'eventId'     => $param['eventId']
            ));                                             // イベント参加・出欠情報の更新
            $_euDao->commitTransaction($_conn);             // イベント参加・出欠情報更新・確定（コミット）
            
            $_res['status']  = 0;
            $_res['message'] = Message::getMessage("info.pta.possibled_presence-update", array($param['eventId']));
            
            self::$log->info(sprintf("%s(commit): eventId=%d modified.", __METHOD__, $param['eventId']));
            
        } catch (DataAccessException $dberr) {
            $_euDao->endTransaction($_conn);                // イベント参加・出欠情報更新・無効（ロールバック）
            CommonUtils::errorProcess(self::$log, $_res, array(
                'typename'  => __METHOD__,
                'exception' => $dberr,
                'errorId'   => "error.pta.impossibled_event-update"
            ), array($dberr->getCode()));
        }
        
        // データベースから切り離す
        self::disconnect($_conn);
        
        self::$log->finish(__METHOD__);
        
        return $_res;
    }
    
    /*
     * イベント参加情報の出欠情報を更新するために必要なバックエンド情報にアクセスする。
     * 取得情報は連想配列に格納して呼び出し元に返却する。なお、一般ユーザー情報の有効性として日付(date)情報がヌル以外の情報であることを条件として加味する。
     */
    private function handleBackendData($groupId, $userId, $connection) {
        $_ope = array(
            'gu_sql' => "get_groupusers",
            'gu_where' => array(GroupUsersDao::OPE=>sprintf(" WHERE groupid=%d AND userid=%d AND date IS NOT NULL", $groupId, $userId))
        );
        
        $_res = array();
        try {
            $_guDao =& new GroupUsersDao($connection);
            $_gus = $_guDao->findByCondition($_ope['gu_sql'], $_ope['gu_where']);
            $_guDao = null;
            $_res['gus'] = $_gus[0];
            
        } catch (DataAccessException $dberr) {
            self::$log->error($dberr->getMessage(), $dberr);
            throw $dberr;
        }
        
        return $_res;
    }
}
?>